Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-585-1
gp Kapitel 20 Tastatur- und Mausereignisse
  gp 20.1 Die Tastaturschnittstelle
    gp 20.1.1 Die Tastaturereignisse im Überblick
    gp 20.1.2 Die Ereignisse »KeyDown« und »KeyUp«
    gp 20.1.3 Das Ereignis »KeyPress«
    gp 20.1.4 Die Tastaturereignisse der Form
    gp 20.1.5 Senden von Tastatureingaben
  gp 20.2 Die Mausschnittstelle
    gp 20.2.1 Die Ereignisse »MouseDown«, »MouseMove« und »MouseUp«
    gp 20.2.2 Weitere Mausereignisse
    gp 20.2.3 Die »Click«-Ereignisse
    gp 20.2.4 Eigenschaften der Maus


Galileo Computing

20.2 Die Mausschnittstelle  downtop

Obschon die meisten Anwendungsprogramme auch ohne Maus bedient werden können, gehört die Maus zur Standardausrüstung jedes PC. Die angebotenen Ausführungen reichen dabei von einer Zweitasten- über eine Dreitastenmaus bis hin zur IntelliMouse, bei der anstelle einer dritten Taste ein Rädchen zu finden ist, das beim Drücken die dritte Taste ersetzt. Programme, die das Rädchen unterstützen, können beispielsweise durch lange Dokumente scrollen, so wie Sie es vom Bildlauf durch lange Webseiten her kennen.

Durch eine Mausaktion können mehrere verschiedene Ereignisse ausgelöst werden. Zwei haben wir im Verlauf der letzten Kapitel schon eingesetzt: Click und DoubleClick. Da diese Ereignisse nicht nur bei einem Mausklick, sondern auch durch die Tastatur ausgelöst werden können, sind beide durch MouseClick und MouseDoubleClick ergänzt worden, die nur auf die Maus reagieren.

Darüber hinaus stehen Ihnen noch folgende Ereignisse zur Verfügung:

gp  MouseDown
gp  MouseEnter
gp  MouseHover
gp  MouseLeave
gp  MouseMove
gp  MouseUp
gp  MouseWheel

Grundsätzlich kann immer nur eine Komponente Mausereignisse empfangen. Wird der Mauscursor über das Steuerelement einer Form bewegt, empfängt nicht die Form das Mausereignis, sondern das Steuerelement. Das setzt selbstverständlich voraus, dass das Steuerelement sichtbar und aktiviert ist (Enabled=True). Manchmal liegen auch zwei Steuerelemente übereinander. Dann ist der Empfänger der Mausereignisse das Element, das in der z-Reihenfolge an oberster Stelle liegt. Eine Form empfängt nur Mausereignisse, wenn sich der Mauszeiger über dem Clientbereich befindet, allerdings weder im Bereich des Rahmens und der Titelleiste, noch über den Schaltflächen in der Titelleiste.


Galileo Computing

20.2.1 Die Ereignisse »MouseDown«, »MouseMove« und »MouseUp«  downtop

Drei der oben aufgeführten Mausereignisse spielen in nahezu jeder Anwendung eine wichtige Rolle, deshalb wollen wir uns diesen zu Anfang widmen: MouseDown, MouseMove und MouseUp.

Aus dem Bezeichner kann schon entnommen werden, wann die Ereignisse ausgelöst werden: MouseDown, wenn eine Maustaste gedrückt wird, und MouseUp, wenn die Maustaste losgelassen wird. Wird die Maus über eine Komponente bewegt, werden unzählige MouseMove-Ereignisse ausgelöst.


Public Event MouseDown As MouseEventHandler
Public Event MouseMove As MouseEventHandler
Public Event MouseUp As MouseEventHandler

Alle drei Ereignisse sind vom Typ MouseEventHandler und übergeben dem Ereignishandler im zweiten Parameter ein Objekt vom Typ MouseEventArgs, dessen Eigenschaften wir uns nun ansehen wollen.


Tabelle 20.9     Eigenschaften des »MouseEventArgs«-Objekts

Eigenschaft Datentyp Beschreibung
Button MouseButtons Gibt Auskunft darüber, welche Maustaste gedrückt wurde.
Clicks Integer Gibt Auskunft darüber, wie oft die Maustaste gedrückt wurde.
Delta Integer Liefert die Anzahl der Arretierungen, um die das Mausrad gedreht wurde. Abhängig von der Drehrichtung kann die Zahl positiv oder negativ sein.
Location Point Liefert die Mauszeigerkoordinaten x und y in Pixel.
X Integer Ruft die x-Koordinate eines Mausklicks ab.
Y Integer Ruft die y-Koordinate eines Mausklicks ab.

Da die Mausereignisse unabhängig davon, welche Maustaste der Anwender gedrückt hat, ausgelöst werden, ist die Auswertung der Maustaste sehr wichtig. Die Eigenschaft Button liefert uns die gewünschte Information, die durch die Werte der Enumeration MouseButtons beschrieben wird.


Tabelle 20.10     Die Mitglieder der Enumeration »MouseButtons«

Member Beschreibung
None Es wurde keine Maustaste gedrückt.
Left Es wurde die linke Maustaste gedrückt.
Right Es wurde die rechte Maustaste gedrückt.
Middle Es wurde die mittlere Maustaste gedrückt.
XButton1 XButton eins wurde gedrückt.
XButton2 XButton zwei wurde gedrückt.

Während sich für die ersten vier Enumerationskonstanten eine weitergehende Erläuterung erübrigt, muss zu den letzten beiden, XButton1 und XButton2, gesagt werden, dass sie sich auf die Tasten der IntelliMouse Explorer beziehen, die über fünf Tasten verfügt.

Die Auswertung der gedrückten Maustaste ist denkbar einfach. Im Ereignishandler, der mit dem Mausereignis verknüpft ist, wird die Eigenschaft Button des Parameters vom Typ Mouse-EventArgs abgefragt und darauf entsprechend reagiert, z.  B.:


Private Sub Form1_MouseDown(ByVal sender As Object, _
ByVal e As MouseEventArgs) _
Handles MyBase.MouseDown
If e.Button = MouseButtons.Left Then
' die linke Maustaste wurde gedrückt
End If
End Sub

Die Enumeration MouseButtons ist mit dem Flags-Attribut verknüpft, folglich können die Werte auch bitweise miteinander kombiniert werden, um festzustellen, ob der Anwender mehrere Tasten gleichzeitig gedrückt hat. Inwiefern das eine praktische Bedeutung hat, sei an dieser Stelle nicht weiter diskutiert.

Sollten Sie als Linkshänder in der Systemsteuerung von Windows die linke und rechte Maustaste vertauscht haben, wird Ihnen bei der Auswertung von MouseButtons trotz des Drückens der rechten Maustaste Left zurückgegeben. Sinnvoller wäre es daher gewesen, zwischen einer primären und einer sekundären Maustaste zu unterscheiden und dabei die primäre mit der gleichzusetzen, mit der standardmäßig das Click-Ereignis ausgelöst wird.

Die MouseEventsArgs-Eigenschaft Clicks liefert nur die Zahlen 1 oder 2. Damit lässt sich feststellen, ob es sich um einen einfachen oder einen Doppelklick des Anwenders gehandelt hat.


Hinweis

Wenn es Sie interessiert, wie schnell zwei Mausklicks hintereinander erfolgen müssen, um als Doppelklick interpretiert zu werden, liefert die statische Methode DoubleClickTime der Klasse SystemInformation im Namespace System.Windows.Forms die Zeitspanne in Millisekunden.


Die Eigenschaften X und Y enthalten die aktuellen Koordinaten des Mauscursors, Location liefert beide Werte gleichzeitig über ein Point-Objekt. Die Werte in Pixel beziehen sich immer auf das Steuerelement oder die Form, über deren Bereich sich der Mauszeiger befindet. Dabei ist der Nullpunkt immer die linke obere Ecke der Komponente, die das Mausereignis ausgelöst hat.

Im folgenden Beispiel MouseMoveDemo wird in einer PictureBox an der aktuellen Mauszeigerposition ein Fadenkreuz aus einer vertikalen und einer horizontalen Linie gezeichnet, die jeweils von einem Rand bis zum gegenüberliegenden reicht.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 20.1     Ausgabe des Beispiels »MouseMoveDemo«


' ----------------------------------------------------------
' Beispiel: ...\Kapitel 20\MouseMoveDemo
' ----------------------------------------------------------
Public Class Form1
Private MousePoint As Point
Private Sub PictureBox1_MouseMove(ByVal sender As Object, _
ByVal e As MouseEventArgs) _
Handles PictureBox1.MouseMove
txtX.Text = e.X
txtY.Text = e.Y
' altes Fadenkreuz löschen
Dim graph As Graphics = PictureBox1.CreateGraphics()
DrawLines(graph, MousePoint, PictureBox1.BackColor)
' neues Fadenkreuz zeichnen
MousePoint = New Point(e.X, e.Y)
DrawLines(graph, MousePoint, Color.White)
graph.Dispose()
End Sub
Private Sub DrawLines(ByVal graph As Graphics, _
ByVal p As Point, ByVal c As Color)
Dim pn As Pen = New Pen(c)
Dim startHor As Point = New Point(0, p.Y)
Dim endHor As Point = New Point(PictureBox1.Width, p.Y)
Dim startVert As Point = New Point(p.X, 0)
Dim endVert As Point = New Point(p.X, PictureBox1.Height)
' Fadenkreuz zeichnen
graph.DrawLine(pn, startHor, endHor)
graph.DrawLine(pn, startVert, endVert)
End Sub
End Class

Das Fadenkreuz wird gezeichnet, sobald die Maus in den Clientbereich der Picturebox eintritt. Die Koordinaten des Mauszeigers werden in je einer Textbox ausgegeben.

Damit die Picturebox beim Ziehen der Maus nur das aktuelle Fadenkreuz anzeigt, muss zuerst das ungültige gewordene Fadenkreuz gelöscht werden. Dazu ist auf Klassenebene das Feld MousePoint deklariert, das immer die Mauskoordinaten enthält, mit denen das letzte Fadenkreuz gezeichnet worden ist. Mit diesen Punktkoordinaten wird zuerst ein Fadenkreuz in der Hintergrundfarbe der Picturebox gezeichnet. Das ungültig gewordene Fadenkreuz ist damit »gelöscht«. Die aktuellen Mauskoordinaten werden anschließend in das Feld MousePoint geschrieben und das neue Fadenkreuz in weißer Farbe gezeichnet.

Das Zeichnen eines Fadenkreuzes übernimmt die Methode DrawLines der Form, die aus dem MouseMove-Ereignis heraus sowohl für das zu löschende als auch das neu zu zeichnende Fadenkreuz aufgerufen wird. Zum Zeichnen bedienen wir uns einer Methode der Graphics-Klasse: DrawLine, der wir als erstes Argument ein Pen-Objekt übergeben, das die Farbe des Fadenkreuzes beschreibt. Je zwei Point-Objekte legen den Start- und den Endpunkt jeder Linie fest.


Galileo Computing

20.2.2 Weitere Mausereignisse  downtop

Mit den folgenden drei Mausereignissen lassen sich auch spezielle Anwendungsfälle erfassen:

gp  MouseEnter wird ausgelöst, wenn der Mauszeiger in den Bereich der Komponente eindringt.
gp  MouseHover tritt auf, wenn der Mauszeiger im Clientbereich der Komponente einen Augenblick lang bewegungslos verharrt. Wird der Mauszeiger kontinuierlich bewegt, wird das Ereignis nicht ausgelöst.
gp  MouseLeave ist das Gegenstück zu MouseEnter. Es wird ausgelöst, wenn der Mauszeiger den Clientbereich der Komponente verlässt.

Alle drei Ereignisse sind vom Typ EventHandler und stellen dem Ereignishandler somit auch keine weiteren Informationen zur Verfügung, denn das Objekt EventArgs enthält bekanntlich keine spezifischen Eigenschaften.


Galileo Computing

20.2.3 Die »Click«-Ereignisse  downtop

Die Ereignisse Click und DoubleClick sowie analog MouseClick und MouseDoubleClick sind an die primäre Maustaste gebunden. Standardmäßig ist das die linke. Nur wenn ein Linkshänder in der Systemsteuerung eine andere Vorgabe gewählt hat, handelt es sich um die rechte. Das Click-Ereignis tritt nach dem Ereignis MouseDown, aber noch vor MouseUp auf. Ein Doppelklick wird dann erkannt, wenn innerhalb einer bestimmten Zeitspanne kurz hintereinander auf die primäre Maustaste gedrückt wird.


Galileo Computing

20.2.4 Eigenschaften der Maus  toptop

Die Eigenschaft »Cursor«

Die Darstellung des Mauszeigers zur Laufzeit wird durch die in der Klasse Control definierte Eigenschaft Cursor festgelegt.


Public Property Cursor As Cursor

Ausnahmsweise sind die vordefinierten Cursortypen nicht in einer Aufzählung, sondern in der Klasse Cursors enthalten. Der Mauscursor kann in Abhängigkeit von seiner Position verändert werden. Beispielsweise sollten Sie die Standardeinstellung Cursors.Default in die durch Cursors.WaitCursor beschriebene Sanduhr ändern, um den Anwender auf eine länger andauernde Operation hinzuweisen. Nach der Operation dürfen Sie nicht vergessen, den ursprünglichen Mauscursor wiederherzustellen:


Me.Cursor = Cursors.WaitCursor
...
Me.Cursor = Cursors.Default

Sowohl das Formular als auch die Steuerelemente ermöglichen eine Anpassung des Cursors an die aktuellen Gegebenheiten. Stellen Sie diese Eigenschaft für die Form ein, gilt dies auch für die darin enthaltenen Steuerelemente, solange Sie diesen nicht ausdrücklich eine andere Einstellung zuweisen.

Die Eigenschaft »Cursor.Position«

Die Klasse Cursor veröffentlicht eigene Eigenschaften und Methoden. Die interessanteste dürfte in diesem Zusammenhang die statische Eigenschaft Position sein, mit der die Position des Mauszeigers nicht nur abgerufen, sondern auch gesetzt werden kann:


Public Shared Property Position As Point

Die durch das Point-Objekt beschriebenen Koordinaten sind Bildschirmkoordinaten. Daher führt die Anweisung


Cursor.Position = New Point(0, 0)

dazu, dass der Mauszeiger in die obere linke Ecke des Bildschirms springt – auch wenn die neue Position außerhalb der aktuellen Form liegt.

Die Eigenschaft »Control.MousePosition«

Sehr ähnlich ist auch die statische Eigenschaft MousePosition der Klasse Control. Sie ist schreibgeschützt und liefert die Mausposition in Bildschirmkoordinaten, also bezogen auf den obersten linken Eckpunkt des Bildschirms:


Public ReadOnly Shared Property MousePosition As Point

Mit


Me.Text = Control.MousePosition.ToString()

kann man sich die Positionskoordinaten ausgeben lassen – in dieser Anweisung in der Titelleiste des Formulars. Interessant ist, dass die überschriebene Methode ToString dabei sofort eine lesbare Anzeige liefert und somit auch ein gutes Beispiel dafür ist, sich immer zu überlegen, ob diese von Object geerbte Methode sinnvoll überschrieben werden sollte.

Die Methode »PointToClient«

MousePosition liefert immer Bildschirmkoordinaten zurück. Manchmal muss man diese in Clientkoordinaten umrechnen. Mit der Methode PointToClient, die in der Klasse Control definiert ist und sich an die aus dieser Klasse abgeleiteten Steuerelemente weitervererbt, können Sie das erreichen:


Public Function PointToClient(Point) As Point

Übergeben wird in diesem Fall der Inhalt der Eigenschaft MousePosition, z.  B.:


Me.Text = Me.PointToClient(Control.MousePosition).ToString()

Das zurückgegebene Point-Objekt kann sogar negative Werte enthalten. Folglich bietet sich PointToClient an, um den Abstand des Mauszeigers von einem beliebigen Steuerelement in Pixel zu ermitteln.

Feststellen, ob eine Zustandstaste gedrückt ist

Manchmal möchte man, dass Mausaktionen nur dann ausgeführt werden, wenn eine oder mehrere der Zustandstasten (Strg), (Alt) und (Shift) gedrückt sind. Hier kann die statische Eigenschaft ModifierKeys, die schon weiter oben erwähnt wurde, sinnvoll eingesetzt werden.

Soll das im Beispiel MouseMoveDemo gezeichnete Fadenkreuz nur dann an der aktuellen Mausposition dargestellt werden, wenn gleichzeitig die (Alt)-Taste gedrückt ist, müssten wir den Ereignishandler des Ereignisses MouseMove wie folgt ergänzen:


Private Sub PictureBox1_MouseMove(...) _
Handles PictureBox1.MouseMove
If (Control.ModifierKeys = Keys.Alt) Then
txtX.Text = e.X
txtY.Text = e.Y
' altes Fadenkreuz löschen
Dim graph As Graphics = PictureBox1.CreateGraphics()
DrawLines(graph, MousePoint, PictureBox1.BackColor)
' neues Fadenkreuz zeichnen
MousePoint = New Point(e.X, e.Y)
DrawLines(graph, MousePoint, Color.White)
graph.Dispose()
End If
End Sub

 <<   zurück
  
  Zum Katalog
Zum Katalog: Visual Basic 2005
Visual Basic 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2005






 Visual C# 2005


Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Das Programmierhandbuch SQL Server 2005






 Das Programmier-
 handbuch
 SQL Server 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de